/**
 * 圆形类
 */
function Circle (x, y, radius) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.strokeStyle = 'rgba(255, 255, 208, .9)';
    this.fillStyle = 'rgba(147, 197, 114, .8)';
}

Circle.prototype = (function (o) {
    var s = new Shape();
    for(var p in o) {
        s[p] = o[p]
    }
    return s;
})({
    /**
     * 重写碰撞检测调用函数
     * @param {Shape} 受测图形
     */
    collidesWith: function (shape) {
        // var axes = shape.getAxes(), distance;
        // //若axes有值，则shape是多边形，否则说明shape是也是圆（用外接圆碰撞检测就行）

        // if(axes === undefined) {
        //     // 受测图形是 Circle
        //     distance = Math.sqrt( Math.pow(shape.x - this.x, 2) + Math.pow(shape.y - this.y, 2) );
        //     return distance < Math.abs(shape.radius + this.radius);
        // } else {
        //     // 受测图形是 Polygon
        //     return polygonCollidesWithCircle(shape, this);
        // }

        //加入最小平移向量后
        if(shape.radius === undefined) {
            return polygonCollidesWithCircle(shape, this);
        } else {
            return circleCollidesWithCircle(this, shape);
        }
    },

    //获取 圆 的投影轴
    getAxes: function () {
        // 圆 有无数条投影轴
        return undefined;
    },

    /**
     * 获取圆形，在指定轴上的投影
     * @param {VectorB} axis 单位法向量（投影轴）
     * @return {Projection} 该圆的投影对象
     */
    project: function (axis) {
        var scalars = [],
            point = new Point(this.x, this.y),
            dotProduct = new VectorB(point).dotProduct(axis);
        scalars.push(dotProduct);
        scalars.push(dotProduct + this.radius);
        scalars.push(dotProduct - this.radius);
        return new Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));
    },

    /**
     * 相对位移
     */
    move: function (dx, dy) {
        this.x += dx;
        this.y += dy;
    },

    createPath: function (ctx) {
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);
        //此处不能closePath，因为会画出一条连接到圆心的直线
    }
})